package com.qianxun.spider.config;

import com.qianxun.spider.bean.SpiderBean;
import com.qianxun.spider.monitor.SpiderMonitor;
import com.qianxun.spider.pipeline.SpiderPipeline;
import lombok.Getter;

import java.util.ArrayList;
import java.util.List;

/**
 * 爬取对象配置
 * @author: huwei
 * @date: 2020/6/28 11:15
 * @version: 1.0.0
 */
public class SpiderBeanConfig {
    /**
     * 定义爬取页面所需要提取的数据内容
     */
    @Getter
    private SpiderBean spiderBean;
    /**
     * 设定当前SpiderBean所对应解析的页面的Url地址，即爬虫爬取的url地址与urlTemplate匹配时，才运用当前的SpiderBean进行数据的解析；
     * 可使用通配符：*
     * 也可以使用：{正则}  的方式
     * 示例：* :表示匹配所有的url地址
     * http://www.baidu.com/{*}/a/{*} ：表示在大括号处匹配任意字符都可，则该模板可匹配：http://www.baidu.com/1/a/2 、http://www.baidu.com/c/a/b 等等
     * http://www.baidu.com/{\w?111} : 标识在大括号处进行正则匹配
     */
    @Getter
    private String urlTemplate;

    /**
     * 内容输出管道，即当数据爬取完毕时，将依次调用该集合管道，用于爬取数据的处理
     */
    @Getter
    private List<SpiderPipeline> spiderPipelineList;

    /**
     * 爬取监听器，用于监管爬取数据时的情况
     */
    @Getter
    private List<SpiderMonitor> spiderMonitorList;

    private SpiderBeanConfig(){
        this.spiderMonitorList = new ArrayList<>();
        this.spiderPipelineList = new ArrayList<>();
    }

    public static SpiderBeanConfig newly(){
        return new SpiderBeanConfig();
    }

    public SpiderBeanConfig spiderBean(SpiderBean spiderBean){
        this.spiderBean = spiderBean;
        return this;
    }

    public SpiderBeanConfig urlTemplate(String urlTemplate){
        this.urlTemplate = urlTemplate;
        return this;
    }

    public SpiderBeanConfig pipeline(SpiderPipeline spiderPipeline){
        this.spiderPipelineList.add(spiderPipeline);
        return this;
    }

    public SpiderBeanConfig monitor(SpiderMonitor spiderMonitor){
        this.spiderMonitorList.add(spiderMonitor);
        return this;
    }

    @Override
    public String toString() {
        return "SpiderBeanConfig{" +
                "spiderBean=" + spiderBean +
                ", urlTemplate='" + urlTemplate + '\'' +
                ", spiderPipelineList=" + spiderPipelineList +
                ", spiderMonitorList=" + spiderMonitorList +
                '}';
    }
}
